import { getEnvConfig, isDevelopment } from '@/common/config/env.js'
import { getToken } from '@/utils/token.js'

/**
 * HTTP请求拦截器配置
 * @param {Object} Vue - Vue实例
 * @param {Object} vm - Vue组件实例
 */
const install = (Vue, vm) => {
	const envConfig = getEnvConfig()
	
	// 设置请求基础配置
	uni.http.setConfig({
		baseUrl: envConfig.baseURL,
		timeout: envConfig.timeout,
		// 如果将此值设置为true，拦截回调中将会返回服务端返回的所有数据response，而不是response.data
		originalData: false, 
		// 设置自定义头部
		header: {
			'Content-Type': 'application/json',
			'Accept': 'application/json'
		}
	});
	
	// 请求拦截器
	uni.http.interceptor.request = (config) => {
		// 添加Token认证
		const token = getToken()
		if (token) {
			config.header.Authorization = `Bearer ${token}`
			// 兼容旧版本
			config.header.Token = token
		}
		
		// 添加时间戳防止缓存
		if (config.method === 'GET') {
			config.data = config.data || {}
			config.data.timestamp = Date.now()
		}
		
		// 开发环境日志
		if (isDevelopment()) {
			console.log('🚀 Request:', config)
		}
		
		return config; 
	}
	
	// 响应拦截器
	uni.http.interceptor.response = (res) => {
		// 开发环境日志
		if (isDevelopment()) {
			console.log('📦 Response:', res)
		}
		
		// 统一的响应状态码处理
		if (res.code === 200 || res.code === '200') {
			return res.data || res
		} 
		
		// Token过期处理
		if (res.code === 401 || res.code === '401') {
			handleTokenExpired()
			return false
		}
		
		// 其他错误处理
		handleRequestError(res)
		return false
	}
}

/**
 * 处理Token过期
 */
function handleTokenExpired() {
	uni.showToast({
		title: '登录已过期，请重新登录',
		icon: 'none'
	})
	
	// 清除本地存储的用户信息
	uni.removeStorageSync('TOKEN')
	
	// 跳转到登录页面
	setTimeout(() => {
		uni.reLaunch({
			url: '/pages/login/index'
		})
	}, 1500)
}

/**
 * 处理请求错误
 * @param {Object} res - 响应数据
 */
function handleRequestError(res) {
	const message = res.message || res.msg || '请求失败'
	
	uni.showToast({
		title: message,
		icon: 'none'
	})
	
	// 开发环境打印详细错误信息
	if (isDevelopment()) {
		console.error('❌ Request Error:', res)
	}
}

export default {
	install
}